#ifndef CLINK_ROUTER_BASEROUTEHANDLER_H
#define CLINK_ROUTER_BASEROUTEHANDLER_H

#include "IRouteHandler.h"
#include "../Utils/RegexUtils.h"
#include "../Utils/StringUtils.h"

#include <string>
#include <vector>
#include <map>
#include <memory>
#include <regex>

#include "../CLink_Export.h"

namespace CLink
{
namespace Router
{

/**
 * @brief 路由参数类型
 */
enum class RouteParamType
{
    STRING,  ///< 字符串参数
    INTEGER, ///< 整数参数
    FLOAT,   ///< 浮点数参数
    BOOLEAN, ///< 布尔参数
    REGEX    ///< 正则表达式参数
};

/**
 * @brief 路由参数定义
 */
struct CLINK_CLASS RouteParam
{
    std::string name;    ///< 参数名称
    RouteParamType type; ///< 参数类型
    std::string pattern; ///< 正则表达式模式（当type为REGEX时使用）
    bool required;       ///< 是否必需

    RouteParam(const std::string &n, RouteParamType t = RouteParamType::STRING, bool req = true, const std::string &p = "")
        : name(n), type(t), pattern(p), required(req) {}
};

/**
 * @brief 基础路由处理器
 *
 * 实现了IRouteHandler接口的基础类，提供了通用的路由匹配和参数提取功能。
 * 具体的路由处理器可以继承这个类，并实现handle方法。
 */
class CLINK_CLASS BaseRouteHandler : public IRouteHandler
{
public:
    /**
     * @brief 构造函数
     * @param path 路由路径
     * @param method HTTP方法
     * @param priority 路由优先级
     */
    BaseRouteHandler(const std::string &path, const std::string &method, int priority = 0);

    /**
     * @brief 析构函数
     */
    virtual ~BaseRouteHandler() = default;

    /**
     * @brief 检查路由是否匹配请求
     * @param context 请求上下文，包含请求、响应和路由参数
     * @return 如果路由匹配返回true，否则返回false
     */
    bool matches(const RequestContext &context) const override;

    /**
     * @brief 获取路由优先级
     * @return 路由优先级，数字越大优先级越高
     */
    int getPriority() const override;

    /**
     * @brief 添加路由参数
     * @param param 路由参数定义
     * @return 当前对象的引用，支持链式调用
     */
    BaseRouteHandler &addParam(const RouteParam &param);

    /**
     * @brief 设置路由优先级
     * @param priority 优先级值
     * @return 当前对象的引用，支持链式调用
     */
    BaseRouteHandler &setPriority(int priority);

    /**
     * @brief 获取路由路径
     * @return 路由路径
     */
    const std::string &getPath() const;

    /**
     * @brief 获取HTTP方法
     * @return HTTP方法
     */
    const std::string &getMethod() const;

    /**
     * @brief 从请求上下文中提取路由参数
     * @param context 请求上下文，包含请求、响应和路由参数
     * @return 参数名和值的映射
     */
    std::map<std::string, std::string> extractDynamicParams(const RequestContext &context) const;
    std::map<std::string, std::string> extractQueryParams(const RequestContext &context) const;
    std::map<std::string, std::string> extractFormParams(const RequestContext &context) const;

    /**
 * @brief 添加查询参数验证
 * @param name 参数名
 * @param required 是否必需
 * @param pattern 验证正则表达式
 * @return 当前对象的引用，支持链式调用
 */
    BaseRouteHandler& addQueryParam(const std::string& name,
        bool required = false,
        const std::string& pattern = "");

    /**
     * @brief 添加查询参数验证
     * @param query 需要限制得参数
     * @return 当前对象的引用，支持链式调用
     */
    BaseRouteHandler& addQueryParam(const std::vector<RouteParam>& query);

protected:
    std::string m_path;                    ///< 路由路径
    std::string m_method;                  ///< HTTP方法
    int m_priority;                        ///< 路由优先级
    std::vector<RouteParam> m_params;      ///< 路由参数定义
    std::regex m_pathRegex;                ///< 路由路径的正则表达式
    std::vector<std::string> m_paramNames; ///< 路由参数名称列表
    std::vector<RouteParam> m_queryParams; ///< 查询参数定义

    /**
     * @brief 构建路由路径的正则表达式
     */
    void buildPathRegex();

    /**
     * @brief 获取参数类型的正则表达式模式
     * @param type 参数类型
     * @return 正则表达式模式
     */
    std::string getParamPattern(RouteParamType type) const;

    /**
     * @brief 验证查询参数
     * @param context 请求上下文，包含请求、响应和路由参数
     * @return 如果验证通过返回true，否则返回false
     */
    bool validateQueryParams(const RequestContext& context) const;
};

} // namespace Router
} // namespace CLink

#endif // CLINK_ROUTER_BASEROUTEHANDLER_H